/*
多任务处理：电脑同时运行多个程序。
串行：一个任务在一个处理器或处理器核上执行。
并行：多个任务在多个处理器或处理器核上同时执行。
并发：多个任务在时间片段内交替执行。
进程：独立执行的程序单元。系统分配资源的基本单位。
线程：进程内的一个顺序执行单元。CPU调度和执行的最小单位。
主线程：进程至少有一个线程，称为主线程。
*/
#include <iostream>
#include <thread>//C++11创建和管理线程的标准库
using namespace std;

// 一个简单的函数，作为线程的入口函数
void foo(int& Z)
{
    Z++;
    for (int i = 0; i < Z; i++)
    {
        cout << "线程使用函数指针作为可调用参数\n";
    }
}


// 可调用对象的类定义
class ThreadObj
{
public:
    void operator()(int x) const
    {
        for (int i = 0; i < x; i++)
        {
            cout << "线程使用函数对象作为可调用参数\n";
        }
    }
};

int main()//主线程
{
    cout << "线程 1 、2 、3 独立运行" << endl;
    int num = 1;
    // 使用函数指针创建线程
    thread th1(foo, std::ref(num)); // 使用std::ref()函数传递引用
    // 使用函数对象创建线程
    thread th2(ThreadObj(), 3); // 参数通过值传递给线程
    // 使用 Lambda 表达式创建线程
    thread th3([](int x){
        for (int i = 0; i < x; i++) 
        {
            cout << "线程使用 lambda 表达式作为可调用参数\n";
        } 
    }, 3);

    // 等待所有线程完成
    th1.join(); // join()函数等待线程th1执行完成
    th2.join(); // 如果不调用join()函数，主线程会立即退出，导致其他线程被强制终止。
    th3.join(); // detach()函数可以将线程分离，使其在后台运行,主线程不会等待它。

    return 0;
}
/*
线程局部存储TLS：每个线程有自己的数据副本。关键字thread_local避免对共享资源的争用。
线程池ThreadPool：预先创建一组线程，用于执行任务。
线程安全Thread-Safe：多个线程同时访问一个对象时不会发生错误。
*/